package cn.lanqiao.web.interceptors;

import cn.lanqiao.common.entity.User;
import cn.lanqiao.common.utile.Result;

import cn.lanqiao.web.utils.JwtUtils;
import cn.lanqiao.web.utils.RedisUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
   登录拦截器，验证是否登录，没有登录就返回提示信息
 */
@Component
public class LoginInterceptors implements HandlerInterceptor {

    @Autowired
    private RedisUtil redisUtil;

    @Value("${redis.keys.login-tokens}")
    private String loginToken ;

    @Value("${redis.expire-time.token-expire_time}")
    private Long expireTime;

    //方式执行之前进行拦截： true：放行； false：拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("====  经过了拦截器 ====== ");
        response.setContentType("text/html;charset=utf8");
       if(!JwtUtils.checkToken(request)){
           //给前端返回的Result对象
           Result result = Result.ok("token 非法，请重新登录后再试",4002) ;
           // 把 result 对象转变为 json 字符串
           ObjectMapper objectMapper = new ObjectMapper() ;
           String json = objectMapper.writeValueAsString(result) ;
           //把json字符串发送给前端
           response.getWriter().print(json);
           return false;
       }else{

           //token 合法，合法的token，还要检查是否过期
           String token = request.getHeader("token") ;
           //获取用户名
           User user = JwtUtils.getUserByJwtToken(token) ;
           String key = loginToken + user.getUsername() ;
           //判断时间
           if(redisUtil.hasKey(key)){
               //存在
               //没有过期的话，检查token是不是快过期了，如果快过期了码，那么续期
               if(redisUtil.getExpire(key) < 10){
                    //续期
                   redisUtil.del(key);
                   redisUtil.set(key,token,expireTime) ;
               }
           }else{
               //不存在，表示已经过期
               Result result = Result.ok("token 过期，请重新登录后再试",4003);
               // 把 result 对象转变为 json 字符串
               ObjectMapper objectMapper = new ObjectMapper() ;
               String json = objectMapper.writeValueAsString(result) ;
               //把json字符串发送给前端
               response.getWriter().print(json);
               return false;
           }

       }
        return  true ;
    }
}
